<?php
namespace app\index\model;

/**
 * 引入模型基类
 */
use think\Model;

/**
 * 留言模型类
 * 负责处理留言相关的数据库操作
 */
class Message extends Model
{
    /**
     * 设置数据表名
     * @var string
     */
    protected $table = 'mb_message';
    
    /**
     * 自动写入时间戳设置
     * @var string 时间格式为datetime类型
     */
    protected $autoWriteTimestamp = 'datetime';
    
    /**
     * 创建时间字段
     * @var string
     */
    protected $createTime = 'create_time';
    
    /**
     * 更新时间字段
     * @var string
     */
    protected $updateTime = 'update_time';

    /**
     * 关联用户表
     * 定义留言与用户的多对一关联关系
     * 
     * @return \think\model\relation\BelongsTo
     */
    public function user()
    {
        return $this->belongsTo('User', 'user_id');
    }

    /**
     * 关联回复表
     * 定义留言与回复的一对多关联关系
     * 
     * @return \think\model\relation\HasMany
     */
    public function replies()
    {
        return $this->hasMany('Reply', 'message_id');
    }

    /**
     * 关联点赞表
     * 定义留言与点赞的一对多关联关系
     * 
     * @return \think\model\relation\HasMany
     */
    public function likes()
    {
        return $this->hasMany('Like', 'message_id');
    }

    /**
     * 发布留言
     * 创建新的留言记录
     * 
     * @param array $data 留言数据
     * @return array 操作结果
     */
    public function publish($data)
    {
        // 设置留言的用户ID
        $this->user_id = isset($data['user_id']) ? $data['user_id'] : null;
        // 设置留言内容
        $this->content = $data['content'];
        // 设置是否匿名，默认为0（不匿名）
        $this->is_anonymous = isset($data['is_anonymous']) ? $data['is_anonymous'] : 0;
        // 设置留言状态为1（正常）
        $this->status = 1;

        // 保存留言并返回结果
        if ($this->save()) {
            return ['status' => 1, 'msg' => '发布成功', 'data' => $this];
        }
        return ['status' => 0, 'msg' => '发布失败'];
    }

    /**
     * 获取留言列表
     * 带分页功能的留言列表查询
     * 
     * @param int $page 页码
     * @param int $limit 每页显示数量
     * @return \think\Paginator 分页对象
     */
    public function getList($page = 1, $limit = 10)
    {
        // 关联查询用户、回复和点赞信息
        return $this->with(['user', 'replies', 'likes'])
            // 只查询状态为1（正常）的留言
            ->where('status', 1)
            // 按创建时间降序排序（最新的在前）
            ->order('create_time', 'desc')
            // 分页处理
            ->paginate($limit, false, [
                'page' => $page,
                'path' => url('index/index'),
                'query' => request()->param()
            ]);
    }

    /**
     * 获取留言详情
     * 根据ID查询单条留言的详细信息
     * 
     * @param int $id 留言ID
     * @return Message|null 留言对象或null
     */
    public function getDetail($id)
    {
        // 关联查询用户、回复和点赞信息
        return $this->with(['user', 'replies', 'likes'])
            // 根据ID查询
            ->where('id', $id)
            // 只查询状态为1（正常）的留言
            ->where('status', 1)
            // 查找单条记录
            ->find();
    }

    /**
     * 删除留言（软删除）
     * 将留言状态设为0表示删除
     * 
     * @param int $id 留言ID
     * @param int $userId 当前用户ID（用于权限验证）
     * @return array 操作结果
     */
    public function remove($id, $userId)
    {
        // 查找符合条件的留言
        $message = $this->where([
            'id' => $id,
            'user_id' => $userId,
            'status' => 1
        ])->find();

        // 检查留言是否存在且属于当前用户
        if (!$message) {
            return ['status' => 0, 'msg' => '留言不存在或无权删除'];
        }

        // 将状态设为0（表示删除）
        $message->status = 0;
        if ($message->save()) {
            return ['status' => 1, 'msg' => '删除成功'];
        }
        return ['status' => 0, 'msg' => '删除失败'];
    }
} 